# fitting-erro.R

# Exemplo de uso:
#
# source('testes-erro.R')
# source('dados.R')
# Dados <- Danos(3)
# CalcErroLogNormal(Dados)
# PlotErroNormal(Dados)
# PlotErroGamma(Dados)
# PlotErroLogNormal(Dados)
# PlotErroExp(Dados)
# PlotDists(Dados)

DIST_LEN <- 40

## Calculo erros

DistNormal <- function(Dados)
{
	X <- seq(min(Dados), max(Dados), length=DIST_LEN)
	Dist <- dnorm(X, mean=mean(Dados), sd=sd(Dados))
	data.frame(X=X, Y=Dist)
}

DistLogNormal <- function(Dados)
{
	X <- seq(min(Dados), max(Dados), length=DIST_LEN)
	Dist <- dlnorm(X, meanlog=mean(Dados), sdlog=sd(Dados))
	data.frame(X=X, Y=Dist)
}

DistGamma <- function(Dados)
{
	X <- seq(min(Dados), max(Dados), length=DIST_LEN)
	E <- mean(Dados)
	V <- var(Dados)
	alpha <- (E^2)/V
	beta <- E/V
	Dist <- dgamma(X, shape=alpha, scale=1/beta)
	data.frame(X=X, Y=Dist)
}

DistExp <- function(Dados)
{
	X <- seq(min(Dados), max(Dados), length=DIST_LEN)
	rate <- mean(Dados)/var(Dados)
	Dist <- dexp(X, rate)
	data.frame(X=X, Y=Dist)
}

CalcErro <- function(Dados, Dist)
{
	# fazemos distribuição a partir dos dados empiricos
	Dens <- density(Dados, n=length(Dist$X), from=min(Dados), to=max(Dados))$y

	# cálculo do erro
	# começar no 2; ignorar o inicio da distribuição
	sum(abs(Dens[-1] - Dist$Y[-1]))
}

CalcErroNormal <- function(Dados)
	CalcErro(Dados, DistNormal(Dados))

CalcErroLogNormal <- function(Dados)
	CalcErro(Dados, DistLogNormal(Dados))

CalcErroGamma <- function(Dados)
	CalcErro(Dados, DistGamma(Dados))

CalcErroExp <- function(Dados)
	CalcErro(Dados, DistExp(Dados))

TestesErro <- c(CalcErroNormal, CalcErroLogNormal, CalcErroGamma)
TestesErroNomes <- c('Normal', 'Log Normal', 'Gamma')

## Plots

PlotErro <- function(Dados, Dist, DistName)
{
	Cores <- c('brown', 'orange')

	# fazemos distribuição a partir dos dados empiricos
	Dens <- density(Dados, n=DIST_LEN, from=min(Dados), to=max(Dados))

	# cálculo do erro
	# começar no 2; ignorar o inicio da distribuição
	erro <- sum(abs(Dens$y[-1] - Dist$Y[-1]))
	# plot
	title <- paste('erro:', format(erro, digits=4))
	hist(Dados, freq=FALSE, main=title,
		xlab='danos', ylab='probabilidade',
		cex.main = .9, cex.lab = .8)
	for(i in 2:DIST_LEN)  # desenhar linhas de erro
		lines(
			c(Dist$X[i], Dist$X[i]), c(Dens$y[i], Dist$Y[i]),
			lwd=1, col='palevioletred1')
	lines(Dens$x, Dens$y, lwd=2, col=Cores[1])
	lines(Dist$X, Dist$Y, lwd=2, col=Cores[2])

	legend('topright', c('empirica', DistName),
		title='Distribuição:', title.adj=.05,
		lty=rep(1, 1), lwd=c(2, 2),
		col=Cores, bg='white', cex=.6)
}

PlotErroNormal <- function(Dados)
	PlotErro(Dados, DistNormal(Dados), 'Normal')

PlotErroLogNormal <- function(Dados)
	PlotErro(Dados, DistLogNormal(Dados), 'Log-Normal')

PlotErroGamma <- function(Dados)
	PlotErro(Dados, DistGamma(Dados), 'Gamma')

PlotErroExp <- function(Dados)
	PlotErro(Dados, DistExp(Dados), 'Exponencial')

